package com.demo.userprofile.component.service.crowd;

import com.demo.userprofile.component.service.crowd.vo.BaseCrowdRequest;
import com.demo.userprofile.component.service.crowd.vo.Crowd;

/**
 * 抽象人群包处理器
 *
 * @author userprofile_demo
 */
public abstract class AbstractCrowdHandler<T extends BaseCrowdRequest> {

    // 新增人群信息公共方法
    public long createCrowdInfo(T t) {
        // 校验人群基本信息是否合法
        checkCrowdBaseInfo(t);

        // 创建人群基本信息
        long crowdId = createCrowdBaseInfo(t);

        // 补充人群额外信息
        createCrowdExtraInfo(t, crowdId);

        // 人群创建后后置操作
        doAfterCreateCrowdInfo();

        return crowdId;
    }

    public void createCrowd(long crowdId) {
        try {
            // 根据crowdId获取当前Crowd对象
            Crowd crowd = null;
            // 人群创建前置操作
            // 正式创建人群
            doCreateCrowd(crowd);
            // 人群创建后置操作
        } catch (Exception e) {
            // 异常后处理逻辑
        }
    }

    // 具体人群创建方法，与人群创建方式密切相关
    public abstract void doCreateCrowd(Crowd crowd) throws Exception;

    // 针对每一种类型的人群包需要特殊处理的额外存储逻辑
    protected abstract void createCrowdExtraInfo(T t, long crowdId);

    // 校验人群包基本信息是否合法
    private void checkCrowdBaseInfo(T t) {
        // 校验基本参数
    }

    // 创建人群包基本信息并返回人群包ID
    private long createCrowdBaseInfo(T t) {
        // 创建人群包基本信息
        return -1;
    }

    // 人群包创建后置操作
    private void doAfterCreateCrowdInfo() {
        // 后置操作
    }
}
